/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cl.edinet.agencialinea3.ejb.facade;

import cl.aperture.commons.DatoFecha;
import cl.edinet.agencialinea3.ejb.bean.parametro.ParametroDocumento;
import cl.edinet.agencialinea3.ejb.entity.Documento;
import cl.edinet.agencialinea3.ejb.entity.Importador;
import cl.edinet.agencialinea3.ejb.entity.TipoOperacion;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.apache.commons.lang.StringUtils;

/**
 *
 * @author Iván Zúñiga & Tomás Quinteros
 */
@Stateless
public class DocumentoFacade extends AbstractFacade<Documento> {
    @PersistenceContext(unitName = "AgenciaLinea3-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public DocumentoFacade() {
        super(Documento.class);
    }
    
    public int contarByFiltros(ParametroDocumento parametroDocumento) {

        return ((Long) buildQuery(parametroDocumento, true).getSingleResult()).intValue();

    }

    public List<Documento> findAllByParametros(ParametroDocumento parametrosMovimientos) {

        return buildQuery(parametrosMovimientos, false).getResultList();

    }
    
    public Documento getDocumentoByNumeroDespacho(BigDecimal numeroDespacho, boolean isIncluideItems){
        Documento documento = (Documento) getEntityManager().createNativeQuery("select * from documento where numero_despacho="+numeroDespacho,Documento.class).getSingleResult();
        
        if (isIncluideItems) {
            documento.getItemsList().size();
        }
        
        return documento;
        
    }

    
    public Query buildQuery(ParametroDocumento parametroDocumento, boolean isContar) {
        
        Importador consignatario = parametroDocumento.getConsignatario();
        DatoFecha fechaAceptacionDesde = parametroDocumento.getFechaAceptacionDesde();
        DatoFecha fechaAceptacionHasta = parametroDocumento.getFechaAceptacionHasta();
        TipoOperacion tipoOperacion = parametroDocumento.getTipoOperacion();
        
        List<String> where = new ArrayList<String>();
        
        boolean isParametroFechaDesde = false;
        boolean isParametroFechaHasta = false;
        
        String sql = "";
        
        if (isContar) {
            sql = "select count(d.numeroDespacho) from Documento d ";
        } else {
            sql = "select d from Documento d ";
        }
                   
               
        if(consignatario!=null){
            where.add("d.consignatario.codigo = " + consignatario.getCodigo());
        }
        if(fechaAceptacionDesde!=null){
            where.add("d.fechaAceptacion >= :fechaAceptacionDesde");
            isParametroFechaDesde = true;
        }
        if(fechaAceptacionHasta!=null){
            where.add("d.fechaAceptacion <= :fechaAceptacionHasta");
            isParametroFechaHasta = true;
        }
        if(tipoOperacion!=null){
            where.add("d.tipoOperacion.codigo = " + tipoOperacion.getCodigo());
        }
        
        if(!where.isEmpty()){
            sql += " where " + StringUtils.join(where, " and ") + " ";
        }
        
        Query query;
        
        if (isContar) {
            query = getEntityManager().createQuery(sql);
        } else {
            query = getEntityManager().createQuery(sql, Documento.class);
            query.setFirstResult(parametroDocumento.getRegistrosDesde());
            query.setMaxResults(parametroDocumento.getCantidadRegistrosPorPagina());

        }
        
         if (isParametroFechaDesde) {
            query.setParameter("fechaAceptacionDesde", parametroDocumento.getFechaAceptacionDesde().getDate());
        }
        if (isParametroFechaHasta) {
            query.setParameter("fechaAceptacionHasta", parametroDocumento.getFechaAceptacionHasta().getDate());
        }
        
        return query;
        
    }
    
}
